#include <stdio.h>
#include "ofc/DTelNetClient.h"

@interface MyClient : DTelNetClient    // MyClient processes the special server responses 
{
}

- (BOOL) processOpenNegotiation :(int) who :(int) option :(int) state;
- (BOOL) processResponseNegotiation :(int) who :(int) option :(BOOL) accepted;
- (BOOL) processRequestSubNegotiation :(int) option;
- (BOOL) processSpecialCommand :(unsigned char) command;
@end

@implementation MyClient

- (BOOL) processOpenNegotiation :(int) who :(int) option :(int) state;
{
  printf("Opening negotiation option %s for %s state %d\n", 
      [DTelNetClient optionToString :option], (who == DTNC_SERVER ? "Server" : "Client"), state);
  
  return (option == 24 ? YES : NO);    // Accept option 24, refuse others
}

- (BOOL) processResponseNegotiation :(int) who :(int) option :(BOOL) accepted;
{
  printf("Server accepted negotiation option %s for %s state %d\n", 
      [DTelNetClient optionToString :option], (who == DTNC_SERVER ? "Server" : "Client"), accepted);
  
  return YES;
}

- (BOOL) processRequestSubNegotiation :(int) option
{
  printf("Server request the value for the sub negotiation of option %s\n", 
      [DTelNetClient optionToString :option]);
  
  if (option == 24) 
    [self respondSubNegotiation :option :"dec-vt100" :9]; // Send value subnegotiation
  
  return YES;
}

- (BOOL) processSpecialCommand :(unsigned char) command;
{
  printf("Special command: %s received\n", [DTelNetClient commandToString :command]);
  
  return YES;
}
@end

int main(int argc, char *argv[])
{
  MyClient           *client  = [MyClient new];
  DInetSocketAddress *address = [DInetSocketAddress new];
  DURL          *url          = [DURL new];
  DData         *response     = nil;

  [address host :"localhost" :DTNC_PORT];
  
  [client open :address];              // Open connection to the server
  
  if ([client isConnected])
  {
    char buffer[256];
    
    buffer[0] = EOS;
                                       // Open the negotiations
    [client requestOpenNegotiation :DTNC_SERVER :DTNC_TM   :YES];
    
    do
    {
      BOOL input = NO;
      BOOL empty = NO;
      
      do
      {                                // Send user input to server
        [client sendText :buffer];

        if (!input)                    // Receive responses
          response = [client receive];
        
        buffer[0] = EOS;
        
        if (response != nil)
        {
          long i;
          long length = [response length];
      
          printf("Response:");         // Print response
          for (i = 0; i < length; i++)
            printf("%c", [response get :i]);
          
          if (length > 0)
            input = ([response get :(length-1)] != '\n');
          
          empty = (length == 0);
          
          [response free]; response = nil;
        }
      }
      while (([client pendingRequests]) || (empty) || (!input));
      
      fflush(stdout);
                                       // Ask input from user
      fgets(buffer, sizeof(buffer), stdin);
    }                                  // Keep asking till 'exit'
    while (strncmp(buffer, "exit", 4) != 0);
      
    [client close];
  }
  else
    printf("Could not connect to telnet server.\n");
  
  [client  free];                      // Cleanup
  [url     free];
  [address free];
}

